/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Usuario;

/**
 *
 * @author Cristian Perez
 */
public class UsuariosDao {
    private static UsuariosDao instance = null;

    private UsuariosDao () {
        //Instanciacion del Singleton
    }

    public static UsuariosDao getInstance() {
        if(instance == null) {
            instance = new UsuariosDao();
        }
        return instance;
    }
    
    
    public boolean verificarLoginUsuario (Connection c, String usr, String pass) throws SQLException {
        PreparedStatement pstmt = null;
        
        //Creo la consulta
        String query = "SELECT * FROM usuarios WHERE usuario = ? AND contrasena = ?  AND habilitado = 'S' ";
        //Creo la sentencia
        pstmt = c.prepareStatement(query);
        pstmt.setString(1, usr);
        pstmt.setString(2, pass);
        
        //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
        ResultSet rs = pstmt.executeQuery();
        
        boolean resultado = rs.next();

        pstmt.close();
        
        return (resultado);

    }
        public ArrayList getAll(Connection conn) throws SQLException {
         //Creo la variable lista donde la consulta me va a devolver los registros
        ArrayList lista = new ArrayList();
        Statement stmtConsulta = null;

        //Creo la consulta
            String laConsulta = "SELECT * FROM usuarios WHERE habilitado = 'S' ORDER BY idUsuario ASC";
            //Creo la sentencia
            stmtConsulta = conn.createStatement();
            //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
            ResultSet rs = stmtConsulta.executeQuery(laConsulta);


            //Cargo la lista
            while (rs.next()) {
                Usuario auxUsuario = new Usuario(rs.getInt("idUsuario"),rs.getString("nombre"), rs.getString("apellido"),rs.getString("usuario"),rs.getString("contrasena"),rs.getString("direccion"),rs.getString("telefono"),rs.getString("celular"),rs.getString("email"),rs.getInt("idPerfil"));
                lista.add(auxUsuario);
            }
            //Retorno la lista
            stmtConsulta.close();
            return lista;
    }
        
    public void guardarUsuario(Connection conn, Usuario usuario) throws SQLException{
        PreparedStatement pstmt = null;
        
        //Creo la consulta
        String laConsulta = "INSERT INTO usuarios (usuario,contrasena,nombre,apellido,direccion,telefono,celular,email,idperfil,habilitado) VALUES (?,?,?,?,?,?,?,?,?,?)";
        //Creo la sentencia
        pstmt = conn.prepareStatement(laConsulta);
        pstmt.setString(1, usuario.getNombreUsuario());
        pstmt.setString(2, usuario.getContrasena());
        pstmt.setString(3, usuario.getNombre());
        pstmt.setString(4, usuario.getApellido());
        pstmt.setString(5, usuario.getDireccion());
        pstmt.setString(6, usuario.getTelefono());
        pstmt.setString(7, usuario.getCelular());
        pstmt.setString(8, usuario.getEmail());
        pstmt.setInt(9, usuario.getIdPerfil());
        pstmt.setString(10, "S");
        pstmt.execute();
        
        pstmt.close();
     }

    public boolean verificarDisponibilidad(Connection conn, String usuario) throws SQLException {
        PreparedStatement pstmt = null;

        //Creo la consulta
        String query = "SELECT * FROM usuarios WHERE usuario = ?";  
        
        pstmt = conn.prepareStatement(query);
        
        pstmt.setString(1, usuario);
        
        ResultSet rs = pstmt.executeQuery();
        
        boolean resultado = rs.next();
        
        pstmt.close();
        
        return(!resultado);        
    }

    public void actualizarUsuario(Connection conn,int idUsuario, Usuario usuarioModificado) throws SQLException {
        PreparedStatement pstmt = null;
        
        //Creo la consulta
        String laConsulta = "UPDATE usuarios set usuario = ?,nombre = ?,apellido = ?,direccion = ?,telefono = ?,celular = ?,email = ?,idperfil = ? Where idUsuario= '" +  idUsuario + "'";
        //Creo la sentencia
        pstmt = conn.prepareStatement(laConsulta);
        pstmt.setString(1, usuarioModificado.getNombreUsuario());
        pstmt.setString(2, usuarioModificado.getNombre());
        pstmt.setString(3, usuarioModificado.getApellido());
        pstmt.setString(4, usuarioModificado.getDireccion());
        pstmt.setString(5, usuarioModificado.getTelefono());
        pstmt.setString(6, usuarioModificado.getCelular());
        pstmt.setString(7, usuarioModificado.getEmail());
        pstmt.setInt(8, usuarioModificado.getIdPerfil());
        pstmt.execute();
        
        pstmt.close();
    }

    public void modificarPass(Connection conn, Usuario user, String pass) throws SQLException {
        PreparedStatement pstmt = null;
        
        String laConsulta = "UPDATE usuarios set contrasena = ? Where idUsuario= ? ";
        
        pstmt = conn.prepareStatement(laConsulta);
        pstmt.setString(1, pass);
        pstmt.setInt(2, user.getIdUsuario());
        pstmt.execute();
        
        pstmt.close();
    }

    public void bajaDeUsuario(Connection conn, Usuario usuario) throws SQLException {
        PreparedStatement pstmt = null;
         
        String laConsulta = "UPDATE usuarios set habilitado = 'N' Where idUsuario= ? ";
         
        pstmt = conn.prepareStatement(laConsulta);
        pstmt.setInt(1, usuario.getIdUsuario());
        pstmt.execute();
        
        pstmt.close();
    }

    public Usuario dameUsuarioPorNombre(Connection conn, String usr){
        Usuario usuario = null;
        PreparedStatement pstmt = null;

        //Creo la consulta
        String laConsulta = "SELECT * FROM usuarios WHERE usuario = ? ";  
        try {
            pstmt = conn.prepareStatement(laConsulta);
            pstmt.setString(1, usr);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()){
                usuario = new Usuario(rs.getInt("idUsuario"),rs.getString("nombre"), rs.getString("apellido"),rs.getString("usuario"),rs.getString("contrasena"),rs.getString("direccion"),rs.getString("telefono"),rs.getString("celular"),rs.getString("email"),rs.getInt("idPerfil"));
            }
            pstmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(UsuariosDao.class.getName()).log(Level.SEVERE, ex.getMessage() , ex);
        }      
        return(usuario);
    }
}

